home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 501-525 / disk_519 / oaklisp / src.lzh / signal.c < prev    next >
C/C++ Source or Header  |  1991-06-15  |  2KB  |  110 lines

  1. /* Handle signals in whatever os specific way is necessary.
  2.    Basically, we really want to use polling.  In order to do this
  3.    signal_poll_flag is set to TRUE when a signal comes in, and is
  4.    checked and reset by the bytecode emulator at frequent intervals
  5.    when it is safe to field an interrupt. */
  6.  
  7. #include <stdio.h>
  8. #include "config.h"
  9.  
  10. #ifdef SIGNALS
  11.  
  12.  
  13. #ifdef __STDC__
  14. volatile int signal_poll_flag = 0;
  15. #else
  16. int signal_poll_flag = 0;
  17. #endif
  18.  
  19.  
  20. #ifdef unix
  21.  
  22. #include <signal.h>
  23.  
  24. static struct sigvec signal_trap_vec = {0,0,0};
  25.  
  26. /*ARGSUSED*/
  27. static intr_proc(sig,code,scp)
  28.      int sig, code;
  29.      struct sigcontext *scp;
  30. {
  31.   signal_poll_flag += 1;
  32. }
  33.  
  34. void enable_signal_polling()
  35. {
  36.   signal_poll_flag = 0;
  37.   signal_trap_vec.sv_handler = intr_proc;
  38.   if (sigvec(SIGINT, &signal_trap_vec, (struct sigvec *)NULL) != 0)
  39.     fprintf(stderr, "Unable to enable signal polling.\n");
  40. }
  41.  
  42. void disable_signal_polling()
  43. {
  44.   signal_poll_flag = 0;
  45.   signal_trap_vec.sv_handler=SIG_DFL;
  46.   if (sigvec(SIGINT, &signal_trap_vec, (struct sigvec *)NULL) != 0)
  47.     fprintf(stderr, "Unable to disable signal polling.\n");
  48. }
  49.  
  50. void clear_signal()
  51. {
  52.   signal_poll_flag = 0;
  53. }
  54.  
  55. #endif /* unix */
  56.  
  57. #ifdef AMIGA
  58.  
  59. #include <exec/types.h>
  60. #include <libraries/dos.h>
  61. #include <exec/tasks.h>
  62. #include <proto/exec.h>
  63. #define BREAKFLAGS    (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D)
  64.  
  65. static ULONG old_signals;
  66. static APTR old_data;
  67. static APTR old_code;
  68. static struct Task *me = NULL;
  69.   
  70. static __interrupt __asm intr_proc(register __d0 sig, register __a1 *data)
  71. {
  72.   SetSignal(0L, BREAKFLAGS);
  73.   *data = 1;
  74.   return BREAKFLAGS;
  75. }
  76.  
  77. void clear_signal()
  78. {
  79.   SetSignal(0L, BREAKFLAGS);
  80.   signal_poll_flag = 0;
  81. }
  82.  
  83. void disable_signal_polling()
  84. {
  85.   SetExcept(0, ~1);
  86.   me->tc_ExceptData = old_data;
  87.   me->tc_ExceptCode = old_code;
  88.   SetExcept(old_signals, ~1);
  89.   clear_signal();
  90. }
  91.  
  92. void enable_signal_polling()
  93. {
  94.   signal_poll_flag = 0;
  95.   if (me == NULL) {
  96.     onexit(disable_signal_polling);
  97.     me = FindTask(NULL);
  98.     old_data = me->tc_ExceptData;
  99.     old_code = me->tc_ExceptCode;
  100.   }
  101.   old_signals = SetExcept(0L, ~1);
  102.   me->tc_ExceptData = &signal_poll_flag;
  103.   me->tc_ExceptCode = (APTR) intr_proc;
  104.   SetExcept(BREAKFLAGS, ~1);
  105. }
  106.  
  107. #endif /* AMIGA */
  108.  
  109. #endif /* SIGNALS */
  110.